package Array;

import java.util.HashSet;
import java.util.Set;

/**
 * 3. 无重复字符的最长子串
 * 给定一个字符串 s ，请你找出其中不含有重复字符的 最长
 * 子串的长度。
 *
 * 思路：因为只是找出最长子串长度，所以可以使用滑动窗口的思路，我们仅要记录窗口中满足条件的字符的个数，更新最大值结果返回即可。
 *  滑动窗口也是双指针维护。
 */
public class L_3 {
    public int lengthOfLongestSubstring(String s) {
        if(s == null){
            return 0;
        }
        if(s.length() == 1){
            return 1;
        }

        int max = 0;
        // 滑动窗口的左右边界
        int left = 0;
        int right = 0;
        // 判断是否重复
        Set<Character> set = new HashSet<>();
        while (right < s.length()){
            // 如果不重复，则添加到set中，并且右指针右移
            if(set.add(s.charAt(right))){
                right++;
            }else {
                // 如果遇到重复的字符，则左指针右移，并且删除掉左指针指向的字符
                set.remove(s.charAt(left));
                max = Math.max(max,right-left);
                left++;
            }
        }
        return Math.max(max,right-left);
    }
}
